#include "connect_pool.h"
#include "connecter.h"
#include "provider.h"
#include <iostream>
#include "deliver.h"

ConnectPool::ConnectPool(const std::string &amqp_address)
    : amqp_address_(amqp_address), last_thread_index_(0)
{
}

ConnectPool::~ConnectPool()
{
    for (auto connecter : connecters_)
    {
        delete connecter;
    }
}

/**
 * 初始化连接池
 * 
 * @param thread_num 需要创建的连接器数量，即线程数量
 * 
 * 此函数负责根据指定的线程数量创建连接器对象并启动它们所有的连接器对象
 * 都将被存储在内部的连接器列表中以便后续管理和使用
 */
void ConnectPool::init(int thread_num)
{
    // 根据指定的线程数量创建并启动连接器
    for (int i = 0; i < thread_num; ++i)
    {
        // 创建一个新的连接器，传递唯一的ID和RabbitMQ服务器地址给它
        Connecter *connecter = new Connecter(i + 1, amqp_address_);
        // 启动连接器开始工作
        connecter->start();
        connecters_.push_back(connecter);
    }
}

void ConnectPool::addProvider(Provider *provider)
{
    connecters_[last_thread_index_]->addProvider(provider);
    last_thread_index_ = (last_thread_index_ + 1) % connecters_.size();
}

void ConnectPool::dispatch(Deliver *deliver)
{
    connecters_[last_thread_index_]->addDeliver(deliver);
    last_thread_index_ = (last_thread_index_ + 1) % connecters_.size();
}
